home *** CD-ROM | disk | FTP | other *** search
/ Aminet 33 / Aminet 33 - October 1999.iso / Aminet / dev / gui / ClassFree_src.lha / ClassFree_src / CFpumbuttonclass / class.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-07-19  |  9.1 KB  |  326 lines

  1. /* Sample class  for StormC*/
  2.  
  3. #include <clib/alib_protos.h>
  4. #include <proto/exec.h>
  5. #include <proto/intuition.h>
  6. #include <proto/graphics.h>
  7. #include <proto/utility.h>
  8. #include <exec/libraries.h>
  9. #include <intuition/classes.h>
  10. #include <intuition/imageclass.h>
  11. #include <intuition/gadgetclass.h>
  12. #include <dos/dos.h>
  13. #include "class.h"
  14. #include "CFpumbutton.h"
  15. #include "CFbutton.h"
  16. #include "CFtexti.h"
  17. #include "CFglyphi.h"
  18. #ifdef DEBUG
  19.  #include "debug_protos.h"
  20.  extern APTR console;
  21. #endif
  22.  
  23. Class *initclass(struct classbase *base)
  24. {
  25.   Class *cl;
  26.  
  27.   if(cl = MakeClass(CFpumbuttonClassName,CFbuttonClassName,NULL,
  28.         sizeof(struct objectdata),NULL))
  29.   {
  30.     cl->cl_Dispatcher.h_Entry = hookEntry;
  31.     cl->cl_Dispatcher.h_SubEntry = dispatcher;
  32.     AddClass(cl);
  33.   }
  34.   base->cl = cl;
  35.  
  36.   return(cl);
  37. }
  38.  
  39. BOOL removeclass(struct classbase *base)
  40. {
  41.   BOOL result;
  42.  
  43.   if(result = FreeClass(base->cl)) base->cl = NULL;
  44.  
  45.   return(result);
  46. }
  47.  
  48. ULONG dispatcher(Class *cl,Object *o,Msg msg)
  49. {
  50.   switch(msg->MethodID)
  51.   {
  52.     case OM_NEW:
  53.       return(newobject(cl,o,msg));
  54.     case OM_DISPOSE:
  55.       return(dispose(cl,o));
  56.     case GM_GOACTIVE:
  57.       return(goactive(cl,o,msg));
  58.     case GM_HANDLEINPUT:
  59.       return(handleinput(cl,o,msg));
  60.     case GM_GOINACTIVE:
  61.       return(goinactive(cl,o,msg));
  62.     case GM_RENDER:
  63.       DoSuperMethodA(cl,o,msg);
  64.       return(render(cl,o,msg));
  65.     default:
  66.       return(DoSuperMethodA(cl,o,msg));
  67.   }
  68. }
  69.  
  70. ULONG newobject(Class *cl,Object *o,Msg msg)
  71. {
  72.   ULONG newobj,count,dri;
  73.   struct Gadget *btn;
  74.   struct Image *img;
  75.   struct objectdata *dt;
  76.   struct TagItem *intags = ((struct opSet *)msg)->ops_AttrList, addtags[10];
  77.   UWORD *pens;
  78.  
  79. //  if(!(dri = GetTagData(GA_DrawInfo,NULL,intags))) return(NULL);
  80.   /* Make gadget */
  81.   if(newobj = DoSuperMethodA(cl,o,msg))
  82.   {
  83.     #ifdef DEBUG
  84.     DLprintf(console,"New Object\n");
  85.     #endif
  86.     btn = (struct Gadget *)newobj;
  87.     dt = (struct objectdata *)INST_DATA(((Class *)o),newobj); /* Screwed up, in OM_NEW */
  88.     /* Adjust gadget values*/
  89.     dt->sellist = NULL;
  90.     dt->labels = (char **)GetTagData(CFPU_Labels,NULL,intags);
  91.     dt->active = GetTagData(CFPU_Active,0,intags);
  92.     count = 0;
  93.     while(dt->labels[count]) count++;
  94.     if(dt->active >= count) dt->active = 0;
  95.     dt->entries = count;
  96.     img = (struct Image *)NewObject(NULL,CFglyphiClassName,
  97.             IA_Top,0,IA_Left,0,IA_Width,22,IA_Height,12,
  98.             TAG_DONE);
  99.     addtags[0].ti_Tag = GA_Height; addtags[0].ti_Data = 14;
  100.     addtags[1].ti_Tag = GA_Text; addtags[1].ti_Data = (ULONG)dt->labels[dt->active];
  101.     addtags[2].ti_Tag = GA_Image; addtags[2].ti_Data = (ULONG)img;
  102.     addtags[3].ti_Tag = CFBU_Layout; addtags[3].ti_Data = LAYOUT_TXTLEFT|LAYOUT_IMGLEFT;
  103.     addtags[4].ti_Tag = TAG_DONE;
  104.     DoSuperMethod(cl,(Object *)newobj,OM_SET,addtags,NULL);
  105.     #ifdef DEBUG
  106.     DLprintf(console,"Attributes set, returning.\n");
  107.     #endif
  108.   }
  109.   return(newobj);
  110. }
  111.  
  112. ULONG dispose(Class *cl,Object *o)
  113. {
  114.   struct objectdata *dt = (struct objectdata *)INST_DATA(cl,o);
  115.  
  116.   DoSuperMethod(cl,o,OM_DISPOSE);
  117.  
  118.   return(NULL);
  119. }
  120.  
  121.  
  122. ULONG goactive(Class *cl,Object *o,Msg msg)
  123. {
  124.   struct gpInput *input = (struct gpInput *)msg;
  125.   struct Gadget *btn = (struct Gadget *)o;
  126.   struct GadgetInfo *gi = input->gpi_GInfo;
  127.   struct RastPort *rp;
  128.   struct objectdata *dt = (struct objectdata *)INST_DATA(cl,o);
  129.   UWORD *pens = gi->gi_DrInfo->dri_Pens;
  130.   struct gpRender rend;
  131.   struct impDraw draw;
  132.   struct Image *tmpimg;
  133.   UWORD index;
  134.  
  135.   if(dt->actwin = OpenWindowTags(NULL,
  136.           WA_Left, gi->gi_Window->LeftEdge+btn->LeftEdge+20,
  137.           WA_Top, gi->gi_Window->TopEdge+btn->TopEdge+btn->Height,
  138.           WA_Width, btn->Width-20,
  139.           WA_Height, dt->entries*(gi->gi_Window->RPort->TxHeight+1)+4,
  140.           WA_CustomScreen, gi->gi_Screen,
  141.           WA_IDCMP, IDCMP_CHANGEWINDOW,
  142.           WA_Borderless, TRUE,
  143.           WA_SimpleRefresh, TRUE,
  144.           WA_Activate, FALSE,
  145.           TAG_DONE))
  146.   {
  147. // Fontchange recognition unimplemented!
  148. //    /* In case of fontchange, change size of window acording to new font
  149. //       height. Kind of a workaround, but there isn't really an easy way
  150. //       to do this.. */
  151. //    ChangeWindowBox(dt->actwin,dt->actwin->LeftEdge,dt->actwin->TopEdge,
  152. //            dt->actwin->Width,dt->entries*(dt->actwin->RPort->TxHeight+2)+4);
  153.     rp = dt->actwin->RPort;
  154.     SetRast(rp,pens[SHINEPEN]);
  155.     SetAPen(rp,pens[SHADOWPEN]);
  156.     Move(rp,0,0);
  157.     Draw(rp,dt->actwin->Width-1,0);
  158.     Move(rp,0,0);
  159.     Draw(rp,0,dt->actwin->Height);
  160.     Move(rp,1,0);
  161.     Draw(rp,1,dt->actwin->Height);
  162.     Move(rp,dt->actwin->Width-2,0);
  163.     Draw(rp,dt->actwin->Width-2,dt->actwin->Height);
  164.     Move(rp,dt->actwin->Width-1,0);
  165.     Draw(rp,dt->actwin->Width-1,dt->actwin->Height);
  166.     Move(rp,0,dt->actwin->Height-1);
  167.     Draw(rp,dt->actwin->Width,dt->actwin->Height-1);
  168.     DoSuperMethodA(cl,o,msg);
  169.     rend.MethodID = GM_RENDER;
  170.     rend.gpr_GInfo = gi;
  171.     rend.gpr_RPort = ObtainGIRPort(gi);
  172.     rend.gpr_Redraw = GREDRAW_REDRAW;
  173.     render(cl,o,(Msg)&rend);
  174.     ReleaseGIRPort(rend.gpr_RPort);
  175.     /* Setup text images */
  176.     dt->sellist = (struct Image *)NewObject(NULL,CFtextiClassName,
  177.         IA_Left, 4, IA_Top, 2,
  178.         IA_Width, dt->actwin->Width-8,
  179.         IA_Data, dt->labels[0],
  180.         IA_FGPen, pens[TEXTPEN], IA_BGPen, pens[SHINEPEN],
  181.         TAG_DONE);
  182.     tmpimg = dt->sellist;
  183.     index = 1;
  184.     while(dt->labels[index])
  185.     {
  186.       tmpimg->NextImage = (struct Image *)NewObject(NULL,CFtextiClassName,
  187.               IA_Left, 4, IA_Top, index*(dt->actwin->RPort->TxHeight+1)+2,
  188.               IA_Width, dt->actwin->Width-8,
  189.               IA_Data, dt->labels[index],
  190.             IA_FGPen, pens[TEXTPEN], IA_BGPen, pens[SHINEPEN],
  191.               TAG_DONE);
  192.       tmpimg = tmpimg->NextImage;
  193.       index++;
  194.     }
  195.     tmpimg->NextImage = NULL;  /* For safetys sake */
  196.     tmpimg = dt->sellist;
  197.     index = 0;
  198.     draw.MethodID = IM_DRAW;
  199.     draw.imp_RPort = dt->actwin->RPort;
  200.     draw.imp_Offset.X = 0; draw.imp_Offset.Y = 0;
  201.     draw.imp_State = IDS_NORMAL;
  202.     draw.imp_DrInfo = NULL;
  203.     while(tmpimg)
  204.     {
  205.       DoMethodA((Object *)tmpimg,(Msg)&draw);
  206.       tmpimg = tmpimg->NextImage;
  207.       index++;
  208.     };
  209.     dt->selected = NULL;
  210.     return(GMR_MEACTIVE);
  211.   }
  212.   return(GMR_NOREUSE);
  213. }
  214.  
  215.  
  216. ULONG handleinput(Class *cl,Object *o,Msg msg)
  217. {
  218.   struct gpInput *input = (struct gpInput *)msg;
  219.   struct objectdata *dt = (struct objectdata *)INST_DATA(cl,o);
  220.   struct Image *img;
  221.   struct TagItem tag[5];
  222.   struct impDraw draw;
  223.   struct impHitTest htst;
  224.   WORD count = 0,x,y;
  225.   BOOL result;
  226.  
  227.   if(input->gpi_IEvent->ie_Class == IECLASS_RAWMOUSE)
  228.   {
  229.     htst.MethodID = IM_HITTEST;
  230.     x = input->gpi_Mouse.X-22;
  231.     y = input->gpi_Mouse.Y-((struct Gadget *)o)->Height;
  232.     htst.imp_Point.X = x;
  233.     htst.imp_Point.Y = y;
  234.     draw.MethodID = IM_DRAW;
  235.     draw.imp_RPort = dt->actwin->RPort;
  236.     draw.imp_Offset.X = 0; draw.imp_Offset.Y = 0;
  237.     draw.imp_DrInfo = NULL;
  238.     if(x>0 && x<dt->actwin->Width && y>0 && y<dt->actwin->Height)
  239.     {
  240.       img = dt->sellist;
  241.       while(img)
  242.       {
  243.         if(result = DoMethodA((Object *)img,(Msg)&htst))
  244.         {
  245.           if(img!=dt->selected)
  246.           {
  247.             draw.imp_State = IDS_NORMAL;
  248.             DoMethodA((Object *)dt->selected,(Msg)&draw);
  249.             draw.imp_State = IDS_SELECTED;
  250.             DoMethodA((Object *)img,(Msg)&draw);
  251.             dt->selected = img;
  252.           }
  253.           if(input->gpi_IEvent->ie_Code == SELECTUP)
  254.           {
  255.             dt->active = count;
  256.             tag[0].ti_Tag = GA_Text; tag[0].ti_Data = (ULONG)dt->labels[dt->active];
  257.             tag[1].ti_Tag = TAG_DONE;
  258.             DoSuperMethod(cl,o,OM_SET,tag,NULL);
  259.             *input->gpi_Termination = (LONG)count;
  260.             return(GMR_NOREUSE|GMR_VERIFY);
  261.           }
  262.           return(GMR_MEACTIVE);
  263.         } /* if result */
  264.         img = img->NextImage;
  265.         count++;
  266.       } /* while(img) */
  267.     } /* if not outside */
  268.     if(input->gpi_IEvent->ie_Code == SELECTUP) return(GMR_NOREUSE);
  269.     if(dt->selected)
  270.     {
  271.       draw.imp_State = IDS_NORMAL;
  272.       DoMethodA((Object *)dt->selected,(Msg)&draw);
  273.       dt->selected = NULL;
  274.     }
  275.   }
  276.   return(GMR_MEACTIVE);
  277. }
  278.  
  279.  
  280. ULONG goinactive(Class *cl,Object *o,Msg msg)
  281. {
  282.   struct gpGoInactive *gin = (struct gpGoInactive *)msg;
  283.   struct objectdata *dt = (struct objectdata *)INST_DATA(cl,o);
  284.   struct gpRender rend;
  285.   struct Image *tmpimg;
  286.  
  287.   CloseWindow(dt->actwin);
  288.   DoSuperMethodA(cl,o,msg);
  289.   rend.MethodID = GM_RENDER;
  290.   rend.gpr_GInfo = gin->gpgi_GInfo;
  291.   rend.gpr_RPort = ObtainGIRPort(gin->gpgi_GInfo);
  292.   rend.gpr_Redraw = GREDRAW_REDRAW;
  293.   render(cl,o,(Msg)&rend);
  294.   ReleaseGIRPort(rend.gpr_RPort);
  295.   tmpimg = dt->sellist->NextImage;
  296.   do
  297.   {
  298.     DisposeObject(dt->sellist);
  299.     dt->sellist = tmpimg;
  300.     tmpimg = tmpimg->NextImage;
  301.   }
  302.   while(dt->sellist);
  303.  
  304.   return(0);
  305. }
  306.  
  307.  
  308. ULONG render(Class *cl,Object *o,Msg msg)
  309. {
  310.   struct Gadget *btn = (struct Gadget *)o;
  311.   struct gpRender *rend = (struct gpRender *)msg;
  312.   struct RastPort *rp = (struct RastPort *)rend->gpr_RPort;
  313.   UWORD *pens = rend->gpr_GInfo->gi_DrInfo->dri_Pens;
  314.   UWORD x = btn->LeftEdge, y = btn->TopEdge;
  315.  
  316.   x += 8; y += 4;
  317.   SetDrMd(rp,JAM1);
  318.   SetAPen(rp,pens[SHADOWPEN]);
  319.   /* Draw seperator */
  320.   x = btn->LeftEdge + 22; y = btn->TopEdge + 2; Move(rp,x,y);
  321.   y += btn->Height - 5; Draw(rp,x,y);
  322.   x++; Move(rp,x,y); SetAPen(rp,pens[SHINEPEN]);
  323.   y = btn->TopEdge + 2; Draw(rp,x,y);
  324.  
  325.   return(0);
  326. }